/**
 * 
 */
package tp1.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.uqbar.commons.model.ObservableObject;

/**
 * @author david
 *
 */
public class EsferasDelDragon extends ObservableObject{
	
	public static final String PIEZAS = "piezas";
	public static final String PERSONAJES = "personajes";
	public static final String PERSONAJE_SELECCIONADO = "personajeSeleccionado";
	public static final String ESFERAS = "esferas";
	public static final String ESFERA_SELECCIONADA = "esferaSeleccionada";
	public static final String BUSCAR = "buscar";
	public static final String ALCANZA_ESFERA_LABEL = "alcanzaEsferaLabel";
	public static final String CONVOCAR_A_SHENG_LONG = "convocarAsehengLong";
	public static final String TAMANIO_TABLERO = "tamanioTablero";	
	
	private List<Pieza> piezas;
	private List<Personaje> personajes;
	private Personaje personajeSeleccionado;
	private Esfera esferaSeleccionada;
	private List<Esfera> esferas;
	private String alcanzaEsferaLabel;
	private String convocarAsehengLong;
	protected int tamanioTablero;
	
	public EsferasDelDragon() {
		
		this.piezas = new ArrayList<Pieza>();
		this.personajes = new ArrayList<Personaje>();
		this.esferas = new ArrayList<Esfera>();
		
		this.esferas.add(new Esfera("1"));
		this.esferas.add(new Esfera("2"));
		this.esferas.add(new Esfera("3"));
		this.esferas.add(new Esfera("4"));
		this.esferas.add(new Esfera("5"));
		this.esferas.add(new Esfera("6"));
		this.esferas.add(new Esfera("7"));
	}
	
	public void buscar(){
		if(this.getPersonajeSeleccionado() != null 
				&& this.getEsferaSeleccionada() != null 
				&& this.getPersonajeSeleccionado().puedeBuscar(getEsferaSeleccionada())) {
			this.getPersonajeSeleccionado().buscar(this.getEsferaSeleccionada(), this);
			this.getEsferas().remove(this.getEsferaSeleccionada());
			this.firePropertyChange(EsferasDelDragon.ESFERAS, null, this.getEsferas());
			this.getPiezas().remove(this.getEsferaSeleccionada());
			this.firePropertyChange(EsferasDelDragon.PIEZAS, null, this.getPiezas());
			this.setEsferaSeleccionada(null);
			this.setAlcanzaEsferaLabel("Esfera Alcanzada");
		}
		else
			this.setAlcanzaEsferaLabel("Imposible alcanzar esfera");
		
	}
	
	public void posicionarPiezas() {
		int i = 0, x = 0, y = 0;
		boolean libre = false;
		
		///////////////////////////////////////////////////////
		//PROGRAMAR ESTO DE MANERA MAS FELIZ
		for(Pieza pieza : this.getPiezas()) {
			while (!libre) {
				x = new Random().nextInt(this.getTamanioTablero())+1;
				y = new Random().nextInt(this.getTamanioTablero())+1;
				if (i == 0) {
					libre = true;
				} else {
					for(Pieza pieza1 : this.getPiezas().subList(0, i)) {
						if (!libre) {
							libre = x != pieza1.getX() && y != pieza1.getY();
						}
					}
				}
			}
		pieza.setPosicion(new Posicion(x, y));
		i++;
		libre = false;
		}
	}
	
	public void createNewGame(List<Personaje> personajesParticipantes, int tamanioTablero) {
		this.setPersonajes(personajesParticipantes);
		this.setTamanioTablero(tamanioTablero);
		this.setPiezas(new ArrayList<Personaje>());
		this.getPiezas().addAll(personajesParticipantes);
		this.getPiezas().addAll(this.getEsferas());
		this.posicionarPiezas();
		this.firePropertyChange(EsferasDelDragon.PIEZAS, null, this.getPiezas());
	}

	public List<Pieza> getPiezas() {
		return this.piezas;
	}
	
	public void setPiezas(List<Personaje> piezas) {
		this.setProperty(EsferasDelDragon.PIEZAS, piezas);
	}

	public List<Personaje> getPersonajes() {
		return this.personajes;
	}

	public void setPersonajes(List<Personaje> personajes) {
		this.setProperty(EsferasDelDragon.PERSONAJES, personajes);
	}

	public List<Esfera> getEsferas() {
		return this.esferas;
	}
	
	public void setEsferas(List<Esfera> esferas) {
		this.setProperty(EsferasDelDragon.ESFERAS, esferas);
//		this.firePropertyChange(EsferasDelDragon.ESFERAS, null, this.getEsferas());
	}

	public Personaje getPersonajeSeleccionado() {
		return this.personajeSeleccionado;
	}

	public void setPersonajeSeleccionado(Personaje personajeSeleccionado) {
		this.setProperty(EsferasDelDragon.PERSONAJE_SELECCIONADO, personajeSeleccionado);
	}

	public Esfera getEsferaSeleccionada() {
		return this.esferaSeleccionada;
	}

	public void setEsferaSeleccionada(Esfera esferaSeleccionada) {
		this.setProperty(EsferasDelDragon.ESFERA_SELECCIONADA, esferaSeleccionada);
	}

	public String getAlcanzaEsferaLabel() {
		return this.alcanzaEsferaLabel;
	}

	public void setAlcanzaEsferaLabel(String alcanzaEsfera) {
		this.setProperty(EsferasDelDragon.ALCANZA_ESFERA_LABEL, alcanzaEsfera);
	}

	public String getConvocarAsehengLong() {
		return this.convocarAsehengLong;
	}

	public void setConvocarAsehengLong(String convocarAsehengLong) {
		this.setProperty(EsferasDelDragon.CONVOCAR_A_SHENG_LONG, convocarAsehengLong);
	}

	public int getTamanioTablero() {
		return tamanioTablero;
	}

	public void setTamanioTablero(int tamanioTablero) {
		this.setProperty(EsferasDelDragon.TAMANIO_TABLERO, tamanioTablero);
	}
	
}
